import re
from typing import List, Dict

# 软件目录特征模式
SOFTWARE_PATTERNS = {
    '安装目录特征': [
        r'Program Files.*',
        r'Program Files \(x86\).*',
        r'.*\\bin\\',
        r'.*\\application\\',
        r'.*\\software\\'
    ],
    '可执行文件特征': [
        r'unins.*\.exe',  # 卸载程序
        r'setup\.exe',
        r'install\.exe',
        r'.*\.msi'
    ],
    '配置文件特征': [
        r'.*\.ini',
        r'.*\.cfg',
        r'.*\.config',
        r'license\.*',
        r'readme\.*'
    ]
}

# 软件分类体系
SOFTWARE_CATEGORIES = {
    '办公软件': ['Microsoft Office', 'WPS', 'Adobe Acrobat', 'Word', 'Excel', 'PowerPoint', 'PPT', '文档', '表格', '演示', '金山', '永中'],
    '开发工具': ['Visual Studio', 'PyCharm', 'Eclipse', 'Git', 'VS Code', 'IntelliJ', 'Android Studio', 'Xcode', 'Sublime', 'NetBeans', '编译器', 'IDE', 'SDK'],
    '媒体播放': ['VLC', 'Windows Media Player', 'PotPlayer', 'QQ音乐', '网易云音乐', '酷狗', '酷我', 'Music', 'Player', '视频', '音频', 'Media'],
    '图形图像': ['Photoshop', 'GIMP', 'CorelDRAW', '画图', '美图秀秀', 'Snagit', '截图', '图像', '图片', 'Photo', 'Image', 'Adobe', 'Illustrator', 'Premiere'],
    '系统工具': ['压缩软件', '杀毒软件', '系统优化', '驱动管理', '360', '腾讯电脑管家', '鲁大师', 'WinRAR', '7-Zip', 'Bandizip', '压缩', '解压', '杀毒', '安全', '优化', '驱动'],
    '网络应用': ['浏览器', 'Chrome', 'Firefox', 'Edge', 'Safari', 'Opera', '下载工具', '迅雷', 'BT', '通讯软件', 'QQ', '微信', '钉钉', '邮件客户端', 'Outlook', 'Mail'],
    '游戏': ['游戏主程序', '游戏数据文件', 'Steam', 'Epic', '游戏', 'Game', 'GTA', 'LOL', 'PUBG', '王者荣耀', '和平精英'],
    '其他软件': []
}

# 常用软件签名数据库（用于快速识别）
COMMON_SOFTWARE_SIGNATURES = {
    # Microsoft Office 系列
    'Microsoft Office Word': {
        'patterns': ['WINWORD.EXE', 'Microsoft Office Word'],
        'category': '办公软件',
        'publisher': 'Microsoft Corporation'
    },
    'Microsoft Office Excel': {
        'patterns': ['EXCEL.EXE', 'Microsoft Office Excel'],
        'category': '办公软件',
        'publisher': 'Microsoft Corporation'
    },
    'Microsoft Office PowerPoint': {
        'patterns': ['POWERPNT.EXE', 'Microsoft Office PowerPoint'],
        'category': '办公软件',
        'publisher': 'Microsoft Corporation'
    },
    # 开发工具
    'Visual Studio Code': {
        'patterns': ['Code.exe', 'Visual Studio Code'],
        'category': '开发工具',
        'publisher': 'Microsoft Corporation'
    },
    'Git': {
        'patterns': ['git.exe', 'Git'],
        'category': '开发工具',
        'publisher': 'The Git Development Community'
    },
    # 浏览器
    'Google Chrome': {
        'patterns': ['chrome.exe', 'Google Chrome'],
        'category': '网络应用',
        'publisher': 'Google LLC'
    },
    'Mozilla Firefox': {
        'patterns': ['firefox.exe', 'Mozilla Firefox'],
        'category': '网络应用',
        'publisher': 'Mozilla Corporation'
    },
    'Microsoft Edge': {
        'patterns': ['msedge.exe', 'Microsoft Edge'],
        'category': '网络应用',
        'publisher': 'Microsoft Corporation'
    },
    # 压缩软件
    'WinRAR': {
        'patterns': ['WinRAR.exe', 'WinRAR'],
        'category': '系统工具',
        'publisher': 'win.rar GmbH'
    },
    '7-Zip': {
        'patterns': ['7z.exe', '7-Zip'],
        'category': '系统工具',
        'publisher': 'Igor Pavlov'
    }
}

# 排除目录模式（这些目录通常不包含需要识别的软件）
EXCLUDED_DIRECTORIES = [
    r'Windows\\',
    r'Windows.old\\',
    r'AppData\\Local\\Temp\\',
    r'Temp\\',
    r'$RECYCLE.BIN\\',
    r'System Volume Information\\',
    r'ProgramData\\',
    r'Boot\\',
    r'Pagefile.sys',
    r'hiberfil.sys',
    r'swapfile.sys'
]

# 特征文件权重配置（用于计算识别置信度）
FILE_SIGNATURE_WEIGHTS = {
    'uninstaller': 0.8,  # 卸载程序权重
    'setup': 0.7,        # 安装程序权重
    'main_exe': 0.9,     # 主程序权重
    'config': 0.5,       # 配置文件权重
    'license': 0.6       # 许可证文件权重
}

def is_excluded_directory(directory_path: str) -> bool:
    """
    检查目录是否需要排除
    
    Args:
        directory_path: 目录路径
        
    Returns:
        bool: 是否需要排除
    """
    for pattern in EXCLUDED_DIRECTORIES:
        if re.search(pattern, directory_path, re.IGNORECASE):
            return True
    return False

def get_category_from_name(name: str, publisher: str = '', description: str = '') -> str:
    """
    根据软件名称、发布商和描述确定软件分类
    
    Args:
        name: 软件名称
        publisher: 发布商
        description: 描述
        
    Returns:
        str: 软件分类
    """
    search_text = f"{name} {publisher} {description}".lower()
    
    for category, keywords in SOFTWARE_CATEGORIES.items():
        if category == '其他软件':
            continue
        
        for keyword in keywords:
            if keyword.lower() in search_text:
                return category
    
    return '其他软件'

def match_software_signature(executable_name: str, file_info: Dict = None) -> Dict:
    """
    匹配常见软件签名
    
    Args:
        executable_name: 可执行文件名称
        file_info: 文件信息
        
    Returns:
        Dict: 匹配结果，包含软件名称、分类、发布商和置信度
    """
    executable_name_lower = executable_name.lower()
    
    best_match = None
    highest_confidence = 0
    
    for software_name, signature in COMMON_SOFTWARE_SIGNATURES.items():
        confidence = 0
        
        for pattern in signature['patterns']:
            if pattern.lower() in executable_name_lower:
                confidence += 0.5
            
            # 如果有文件信息，进一步匹配
            if file_info:
                if 'FileDescription' in file_info and pattern in file_info['FileDescription']:
                    confidence += 0.3
                if 'ProductName' in file_info and pattern in file_info['ProductName']:
                    confidence += 0.4
                if 'CompanyName' in file_info and signature['publisher'] in file_info['CompanyName']:
                    confidence += 0.3
        
        # 标准化置信度到0-1范围
        confidence = min(confidence, 1.0)
        
        if confidence > highest_confidence:
            highest_confidence = confidence
            best_match = {
                'name': software_name,
                'category': signature['category'],
                'publisher': signature['publisher'],
                'confidence': confidence
            }
    
    return best_match if best_match and highest_confidence > 0.3 else None